package com.jxdinfo.hussar.example.common.schedulingtask;

import com.jxdinfo.hussar.example.common.schedulingtask.dao.CBOItemMasterInventoryInfoMapper;
import com.jxdinfo.hussar.example.common.schedulingtask.model.CBOItemMasterInventoryInfo;
import com.jxdinfo.hussar.example.common.schedulingtask.model.MesBaseItem;
import com.jxdinfo.hussar.example.common.schedulingtask.service.MesBaseItemService;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * @Author QiaoBin
 * @Date 2024/3/11 13:43
 * @PackageName com.jxdinfo.hussar.example.schedulepackage
 * @ClassName BPMScheduleTask
 * @Description: BPM的定时任务
 * @Version 1.0
 */
@Component
@AllArgsConstructor
@Deprecated
public class LuYinScheduleTask {
    private static final Logger logger = LoggerFactory.getLogger(LuYinScheduleTask.class);

    private CBOItemMasterInventoryInfoMapper cboItemMasterInventoryInfoMapper;

    private MesBaseItemService mesBaseItemService;

    /**
     * @Author QiaoBin
     * @Date 2024/3/11 18:06
     * @Description 物料表的定时任务
     */
//    @Scheduled(cron = "*/30 * * * * ?")
//    @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
    public void mesBaseItemTask() {
        logger.info("\n用友-物料产品表-定时任务-开始执行");
        LocalDateTime nowTime = LocalDateTime.now();
        synchronized ("mesBaseItemTask"){
            LocalDateTime scheduleDate = cboItemMasterInventoryInfoMapper.selectMaxScheduleDate();
            String scheduleDateString = "";
            if (scheduleDate != null) {
                scheduleDateString = scheduleDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            }
            //查询创建时间大于定时任务时间，查询出来后把所有数据全部插进去
            logger.info("\n用友-物料产品表-开始查询CBO_ItemMaster表和CBO_InventoryInfo表中创建时间大于任务时间的数据,查询参数scheduleDateString={}", scheduleDateString);
            List<CBOItemMasterInventoryInfo> cboItemMasterInventoryInfoList = cboItemMasterInventoryInfoMapper.selectMoreSchedule(scheduleDateString);
            logger.info("\n用友-物料产品表-开始查询CBO_ItemMaster表和CBO_InventoryInfo表中创建时间大于任务时间的数据,查询结果cboItemMasterInventoryInfoList={}，size={}", cboItemMasterInventoryInfoList,cboItemMasterInventoryInfoList.size());
            if (cboItemMasterInventoryInfoList.size() > 0) {
                ArrayList<MesBaseItem> mesBaseItemList = new ArrayList<>();
                for (int i = 0; i < cboItemMasterInventoryInfoList.size(); i++) {
                    logger.info("\n用友-物料产品表-当前循环次数i={}", i);
                    CBOItemMasterInventoryInfo cboItemMasterInventoryInfo = cboItemMasterInventoryInfoList.get(i);
                    MesBaseItem mesBaseItem = new MesBaseItem();
                    mesBaseItem.setItemCode(cboItemMasterInventoryInfo.getItemCode());  // 料号－》产品物料编码
                    mesBaseItem.setItemCode1(cboItemMasterInventoryInfo.getItemCode1());   // 参考料号1－》参考料号1
                    mesBaseItem.setItemCode2(cboItemMasterInventoryInfo.getItemCode2());   // 参考料号1－》参考料号1
                    mesBaseItem.setItemName(cboItemMasterInventoryInfo.getItemName());            // 品名-》产品物料名称
                    mesBaseItem.setSpecification(cboItemMasterInventoryInfo.getSpecification()); // 规格-》规格型号
                    mesBaseItem.setUnitOfMeasure(cboItemMasterInventoryInfo.getUnitOfMeasure() + ""); // 生产单位 -》 生产单位
                    mesBaseItem.setDelFlag("1".equals(cboItemMasterInventoryInfo.getEnableFlag())?"0":"1");
                    mesBaseItem.setScheduleTime(nowTime);
                    mesBaseItem.setCreateBy(cboItemMasterInventoryInfo.getMasterCreatedBy());
                    mesBaseItem.setCreateTime(cboItemMasterInventoryInfo.getMasterCreatedOn());
                    mesBaseItem.setUpdateBy(cboItemMasterInventoryInfo.getMasterModifiedBy());
                    mesBaseItem.setUpdateTime(cboItemMasterInventoryInfo.getMasterModifiedOn());
                    mesBaseItem.setMasterId(cboItemMasterInventoryInfo.getMasterId());
                    logger.info("\n用友-物料产品表-开始向list中存入数据，数据mesBaseItem={},i={}", mesBaseItem,i);
                    mesBaseItemList.add(mesBaseItem);
                }
                logger.info("\n用友-物料产品表-开始向mes_base_item表中插入数据，数据mesBaseItemList={}", mesBaseItemList);
                boolean b = mesBaseItemService.saveBatch(mesBaseItemList, 100);
                logger.info("\n用友-物料产品表-结束向mes_base_item表中插入数据，插入结果b={}", b);
            }
            if (scheduleDate == null) {
                logger.info("\n用友-物料产品表-查询不到任务时间，说明一次也没有同步，之间原封不动的插入就行,也就不需要更新");
                return;
            }
            if (scheduleDate != null) {
                //查询CBO_ItemMaster和子表CBO_InventoryInfo中更新时间大于定时任务时间，查询出来后把所有数据全部更新进去
                logger.info("\n用友-物料产品表-开始查询CBO_ItemMaster和子表CBO_InventoryInfo更新时间大于任务时间，查询参数scheduleDateString={}", scheduleDateString);
                List<CBOItemMasterInventoryInfo> masterAndInfoUpdateMoreScheduleList = cboItemMasterInventoryInfoMapper.selectUpdateMoreSchedule(scheduleDateString);
                logger.info("\n用友-物料产品表-结束查询CBO_ItemMaster和子表CBO_InventoryInfo更新时间大于任务时间,查询结果masterAndInfoUpdateMoreScheduleList={},数量size={}", masterAndInfoUpdateMoreScheduleList, masterAndInfoUpdateMoreScheduleList.size());

                if (masterAndInfoUpdateMoreScheduleList == null || masterAndInfoUpdateMoreScheduleList.size() == 0) {
                    logger.info("\n用友-物料产品表-没有查询到更新时间大于任务时间的CBO_ItemMaster和子表CBO_InventoryInfo数据");
                    return;
                }
                // moMoUpdateMoreScheduleList转成map集合
                Map<Long, CBOItemMasterInventoryInfo> moMoUpdateMap = masterAndInfoUpdateMoreScheduleList.stream().collect(Collectors.toMap(CBOItemMasterInventoryInfo::getMasterId, t -> t));
                // 获取CBO_ItemMaster和子表CBO_InventoryInfo更新过的主键
                List<Long> masterIdList = masterAndInfoUpdateMoreScheduleList.stream().map(CBOItemMasterInventoryInfo::getMasterId).collect(Collectors.toList());
                logger.info("\n用友-物料产品表-CBO_ItemMaster和子表CBO_InventoryInfo更新时间大于任务时间的主键集合masterIdList={},size={}", masterIdList, masterIdList.size());
                // 根据momo的主键去order和orderline表中查询数据momo_id=主键的记录，重新设置值并更新进去
                logger.info("\n用友-物料产品表-开始查询mes_base_item中master_id=CBO_ItemMaster表中主键的数据,参数masterIdList={}", masterIdList);
                List<MesBaseItem> tMaterialAchieveUpdateList = cboItemMasterInventoryInfoMapper.selectUpdateMoreScheduleOrder(masterIdList);
                logger.info("\n用友-物料产品表-结束查询mes_base_item中master_id=CBO_ItemMaster表中主键的数据,结果tMaterialAchieveUpdateList={},size={}", tMaterialAchieveUpdateList, tMaterialAchieveUpdateList.size());
                if (tMaterialAchieveUpdateList.size() > 0) {
                    ArrayList<MesBaseItem> updateAchieveList = new ArrayList<>();
                    for (int i = 0; i < tMaterialAchieveUpdateList.size(); i++) {
                        logger.info("\n用友-物料产品表-当前更新时间大于任务时间，mes_base_item表更新，次数i={}", i);
                        MesBaseItem mesBaseItem = tMaterialAchieveUpdateList.get(i);
                        Long currentMasterId = mesBaseItem.getMasterId();
                        mesBaseItem.setItemCode(moMoUpdateMap.get(currentMasterId).getItemCode());  // 料号－》产品物料编码
                        mesBaseItem.setItemCode1(moMoUpdateMap.get(currentMasterId).getItemCode1());   // 参考料号1－》参考料号1
                        mesBaseItem.setItemCode2(moMoUpdateMap.get(currentMasterId).getItemCode2());   // 参考料号1－》参考料号1
                        mesBaseItem.setItemName(moMoUpdateMap.get(currentMasterId).getItemName());            // 品名-》物料名称
                        mesBaseItem.setSpecification(moMoUpdateMap.get(currentMasterId).getSpecification()); // 规格-》规格型号
                        mesBaseItem.setUnitOfMeasure(moMoUpdateMap.get(currentMasterId).getUnitOfMeasure() + ""); // 生产单位 -》 生产单位
                        mesBaseItem.setEnableFlag("1".equals(moMoUpdateMap.get(currentMasterId).getEnableFlag())?"0":"1");
                        mesBaseItem.setScheduleTime(nowTime);
                        mesBaseItem.setCreateBy(moMoUpdateMap.get(currentMasterId).getMasterCreatedBy());
                        mesBaseItem.setCreateTime(moMoUpdateMap.get(currentMasterId).getMasterCreatedOn());
                        mesBaseItem.setUpdateBy(moMoUpdateMap.get(currentMasterId).getMasterModifiedBy());
                        mesBaseItem.setUpdateTime(moMoUpdateMap.get(currentMasterId).getMasterModifiedOn());
                        logger.info("\n用友-物料产品表-向updateAchieveList中存储待要更新的物料产品表信息,mesBaseItem={}", mesBaseItem);
                        updateAchieveList.add(mesBaseItem);
                    }
                    logger.info("\n用友-物料产品表-开始更新mes_base_item数据,列表updateAchieveList={}", updateAchieveList);
                    boolean u = mesBaseItemService.updateBatchById(updateAchieveList);
                    logger.info("\n用友-物料产品表-结束更mes_base_item数据,更新结果u={}", u);
                }
            }
        }
        logger.info("\n用友-物料产品表-定时任务-结束执行");
    }
}
